package DisciplinaTopicoView;

import DisciplinaTopico.Disciplina;
import DisciplinaTopico.DisciplinaDAOException;
import DisciplinaTopico.DisciplinaDAOXML;
import DisciplinaTopico.Topico;
import DisciplinaTopico.TopicoDAOException;
import Media.MediaController;
import java.awt.TrayIcon.MessageType;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.ListModel;

public class DisciplinaView extends javax.swing.JFrame implements ITopicosCallback
{
    private Disciplina disciplinaCorrente;
    private static DisciplinaDAOXML discDAO = null;
    private static TopicoDAO topicoDAO;
    private OperacaoAtual operacaoAtual;
    
    public DisciplinaView(TopicoDAO topicoDAO)
    {
        initComponents();

        try
        {
            discDAO = new DisciplinaDAOXML();
        }
        catch (DisciplinaDAOException discEx)
        {
            MediaController.showErrorMessage("Não foi possivel realizar a coneão com o banco de dados. Exceção: " + discEx.getMessage(), "Erro na conexão");
            this.setVisible(false);
        }

        this.topicoDAO = topicoDAO;
        
        populaListaDisciplinas();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        lbxDisciplinas = new javax.swing.JList();
        btnAdicionar = new javax.swing.JButton();
        btnEditar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        tbxNome = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        lbxTopicos = new javax.swing.JList();
        jLabel4 = new javax.swing.JLabel();
        btnSalvar = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        btnEditarTopicos = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Módulo Disciplinas");

        lbxDisciplinas.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        lbxDisciplinas.setToolTipText("Lista de Disciplinas");
        lbxDisciplinas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lbxDisciplinasMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(lbxDisciplinas);

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });

        btnEditar.setText("Editar");
        btnEditar.setEnabled(false);
        btnEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEditarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.setEnabled(false);
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel2.setText("Propriedades");

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jSeparator1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        tbxNome.setEnabled(false);

        jLabel1.setText("Nome:");

        lbxTopicos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        lbxTopicos.setToolTipText("Lista de Tópicos");
        lbxTopicos.setEnabled(false);
        jScrollPane2.setViewportView(lbxTopicos);

        jLabel4.setText("Tópicos:");

        btnSalvar.setText("Salvar");
        btnSalvar.setEnabled(false);
        btnSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSalvarActionPerformed(evt);
            }
        });

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel5.setText("Disciplinas");

        btnEditarTopicos.setText("Tópicos");
        btnEditarTopicos.setEnabled(false);
        btnEditarTopicos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEditarTopicosActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(btnExcluir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnEditar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnAdicionar, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 156, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(12, 12, 12)
                            .addComponent(jLabel2))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(25, 25, 25)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jLabel4)
                                .addComponent(jLabel1))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(btnSalvar, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(tbxNome, javax.swing.GroupLayout.DEFAULT_SIZE, 302, Short.MAX_VALUE)
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 302, Short.MAX_VALUE))))
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnEditarTopicos)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(tbxNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnEditarTopicos)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 70, Short.MAX_VALUE)
                                .addComponent(btnSalvar)
                                .addGap(7, 7, 7))
                            .addComponent(jLabel4)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel5)
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 287, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(btnAdicionar)
                                .addGap(9, 9, 9)
                                .addComponent(btnEditar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btnExcluir)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE)))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAdicionarActionPerformed

        operacaoAtual = OperacaoAtual.ADICIONANDO;
        disciplinaCorrente = new Disciplina();

        limpaCampos();
        trocaStatusBotoes(false);
        
        this.lbxTopicos.setListData(new Object[0]);
        alteraStatusComponentesEdicao(true);
}//GEN-LAST:event_btnAdicionarActionPerformed

    private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEditarActionPerformed

        operacaoAtual = OperacaoAtual.EDITANDO;
        disciplinaCorrente = (Disciplina)this.lbxDisciplinas.getSelectedValue();

        alteraStatusComponentesEdicao(true);
    }//GEN-LAST:event_btnEditarActionPerformed

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExcluirActionPerformed

        if(JOptionPane.showConfirmDialog(null, "Deseja realmente excluir a disciplina '" + disciplinaCorrente.getNome() + "' ?", "Confirmação de Exclusão", MessageType.INFO.ordinal()) == 0)
        {
            try
            {
                discDAO.excluirDisciplina(disciplinaCorrente);

                limpaCampos();
                populaListaDisciplinas();

                JOptionPane.showMessageDialog(null, "Exclusão da disciplina '" + disciplinaCorrente.getNome() + "' realizada com sucesso.", "Exclusão concluída", MessageType.INFO.ordinal());
            }
            catch(DisciplinaDAOException discEx)
            {
                MediaController.showErrorMessage("Não foi possível excluir a disciplina '" + disciplinaCorrente.getNome() + "'. Exception: " + discEx.getMessage(), "Erro na Exclusão");
            }
        }
    }//GEN-LAST:event_btnExcluirActionPerformed

    private void lbxDisciplinasMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lbxDisciplinasMouseClicked

        boolean temItemSelecionado = !this.lbxDisciplinas.isSelectionEmpty();

        if(temItemSelecionado)
        {
            disciplinaCorrente = (Disciplina)this.lbxDisciplinas.getSelectedValue();

            preenchePropriedadesDisciplina(disciplinaCorrente);

            trocaStatusBotoes(temItemSelecionado);
            alteraStatusComponentesEdicao(false);
        }
    }//GEN-LAST:event_lbxDisciplinasMouseClicked

    private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSalvarActionPerformed

        if(validaPropriedades())
        {
            disciplinaCorrente.setNome(tbxNome.getText());

            try
            {
                String mensagem = "";

                if(operacaoAtual == OperacaoAtual.ADICIONANDO)
                {
                    discDAO.adicionarDisciplina(disciplinaCorrente);

                    this.lbxDisciplinas.setListData(discDAO.getDisciplinas().toArray());

                    mensagem = "A disciplina '" + disciplinaCorrente.getNome() + "' foi adicionada com sucesso.";
                }
                else if(operacaoAtual == OperacaoAtual.EDITANDO)
                {
                     discDAO.editarDisciplina(disciplinaCorrente);

                     mensagem = "A disciplina '" + disciplinaCorrente.getNome() + "' foi editada com sucesso.";
                }

                JOptionPane.showMessageDialog(null, mensagem, "Operação concluída", MessageType.INFO.ordinal());

                limpaCampos();
                alteraStatusComponentesEdicao(false);
            }
            catch (DisciplinaDAOException discEx)
            {
                MediaController.showErrorMessage("Não foi possível concluir a operação. Exception: " + discEx.getMessage(),  "Erro");
            }
        }
    }//GEN-LAST:event_btnSalvarActionPerformed

    private void btnEditarTopicosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEditarTopicosActionPerformed
                     
        List<Topico> todosTopicos = new ArrayList<Topico>();

        Disciplina disciplina = (Disciplina)this.lbxDisciplinas.getSelectedValue();
        List<Topico> topicosPreSelecionados = new ArrayList<Topico>();
        todosTopicos = new ArrayList<Topico>();

        if(disciplina != null)
        {
            disciplinaCorrente = disciplina;
            topicosPreSelecionados = disciplinaCorrente.getTopicos();
        }
        else
            topicosPreSelecionados = new ArrayList<Topico>();

        try
        {
            todosTopicos = topicoDAO.getTopicos();

            FrameListaTopico app = new FrameListaTopico("Tópicos", todosTopicos, topicosPreSelecionados, this);
            app.setVisible(true);
        }
        catch(TopicoDAOException topicoEx)
        {
            MediaController.showErrorMessage("Não foi possível concluir a operação. Exception: " + topicoEx.getMessage(),  "Erro");
        }
    }//GEN-LAST:event_btnEditarTopicosActionPerformed

    private boolean validaPropriedades()
    {
        boolean ehValido = true;
        String mensagemErro = "";
        if(tbxNome.getText() == null || tbxNome.getText().isEmpty())
        {
            mensagemErro += "O campo 'Nome' é obrigatório.\n";
            ehValido = false;
        }

        if(!temTopicoSelecionado())
        {
            mensagemErro += "O campo 'Tópicos' é obrigatório.\n";
            ehValido = false;
        }

        if(!mensagemErro.equals(""))
            JOptionPane.showMessageDialog(null, mensagemErro, "Validação dos Campos", MessageType.WARNING.ordinal());

        return ehValido;
    }

    private void alteraStatusComponentesEdicao(boolean habilita)
    {
        this.tbxNome.setEnabled(habilita);
        this.btnEditarTopicos.setEnabled(habilita);
        this.btnSalvar.setEnabled(habilita);
    }
    
    private boolean temTopicoSelecionado()
    {
        ListModel topicosDaLista = this.lbxTopicos.getModel();

        return (topicosDaLista != null && topicosDaLista.getSize() > 0);
    }

    private void limpaCampos()
    {
        this.tbxNome.setText("");

        lbxDisciplinas.clearSelection();
        lbxTopicos.clearSelection();

        lbxTopicos.setListData(new Object[0]);
    }

    private void preenchePropriedadesDisciplina(Disciplina disciplinaSelecionada)
    {
        listaTopicosDaDisciplina(disciplinaSelecionada);   
        this.tbxNome.setText(disciplinaSelecionada.getNome());
    }

    /*
     * Alterada a propriedade 'enabled' dos botões excluir e editar
     */
    private void trocaStatusBotoes(boolean habilita)
    {
        this.btnEditar.setEnabled(habilita);
        this.btnExcluir.setEnabled(habilita);
        this.btnEditarTopicos.setEnabled(habilita);
    }

    /*
     * Popula a lista de disciplinas, carregando as disciplinas contidas no banco
     * de dados
     */
    private void populaListaDisciplinas()
    {
        try
        {
            this.lbxDisciplinas.setListData(discDAO.getDisciplinas().toArray());
        }
        catch (DisciplinaDAOException discEx)
        {
            MediaController.showErrorMessage("Não foi possível listar as disciplinas. Exceção: " + discEx.getMessage(), "Erro Listagem");
        }
    }

    /*
     * Popula a lista de tópicos, carregando os tópicos relacionados a disciplina
     * selecionada
     */
    private void listaTopicosDaDisciplina(Disciplina disciplinaSelecionada)
    {
        List<Topico> topicos = disciplinaSelecionada.getTopicos();

        this.lbxTopicos.setListData(topicos.toArray());
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAdicionar;
    private javax.swing.JButton btnEditar;
    private javax.swing.JButton btnEditarTopicos;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton btnSalvar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JList lbxDisciplinas;
    private javax.swing.JList lbxTopicos;
    private javax.swing.JTextField tbxNome;
    // End of variables declaration//GEN-END:variables

    /* Interface ITpociosCallback */
    public void onSelecaoTerminada(List<Topico> topicosSelecionados)
    {
        if(disciplinaCorrente != null)
        {
            disciplinaCorrente.setTopicos(topicosSelecionados);

            this.lbxTopicos.setListData(topicosSelecionados.toArray());
        }
    }

    private enum OperacaoAtual
    {
        ADICIONANDO,
        EDITANDO
    }
}
